package cn.itcast.demo;

import cn.itcast.demo.pojo.DelayTask;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.concurrent.DelayQueue;

/**
 * @author 虎哥
 */
@Slf4j
public class QueueDemo {

    @Test
    public void test() throws InterruptedException {


        DelayQueue<DelayTask> delayQueue = new DelayQueue<>();

        // 生产者向延迟队列投递消息时，可以指定消息的 延时时长
        // DelayQueue会根据task的有效期排序，剩余有效期越短，排列到队列最前面
        DelayTask task = new DelayTask(2000, "task_1");
        // 插入新元素时，会根据任务时间，再次排序，然后唤醒之前在等待的线程
        delayQueue.add(task);

        log.info("添加一个任务");
        // 我们task元素时，DelayQueue会拿到队首元素，获取剩余有效期
        // 看剩余有效期还剩多久，如果小于登录0，已经到期，直接返回给你
        // 如果大于0，说明没到期，wait 剩余有效期的时间，到期后自动醒来，执行上面逻辑
        DelayTask task2 = delayQueue.take();

        log.info("获取一个任务, {}", task2.getData());

    }
}
